home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / GIMP 2.6.8 / gimp-2.6.8-i686-setup.exe / {app} / share / gimp / 2.0 / scripts / blend-anim.scm < prev    next >
Text File  |  2009-12-15  |  9KB  |  243 lines

  1. ; GIMP - The GNU Image Manipulation Program
  2. ; Copyright (C) 1995 Spencer Kimball and Peter Mattis
  3. ;
  4. ; This program is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2 of the License, or
  7. ; (at your option) any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ; GNU General Public License for more details.
  13. ;
  14. ; You should have received a copy of the GNU General Public License
  15. ; along with this program; if not, write to the Free Software
  16. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ;
  18. ;
  19. ; blend-anim.scm   version 1.03   1999/12/21
  20. ;
  21. ; CHANGE-LOG:
  22. ; 1.00 - initial release
  23. ; 1.01 - some code cleanup, no real changes
  24. ; 1.02 - use gimp-message to output an error message if called
  25. ;        with less than three layers
  26. ; 1.03 - only call blur plugin when blut-radius >= 1.0
  27. ;
  28. ; Copyright (C) 1997-1999 Sven Neumann <sven@gimp.org>
  29. ;
  30. ;
  31. ; Blends two or more layers over a backgound, so that an animation can
  32. ; be saved. A minimum of three layers is required.
  33.  
  34. (define (script-fu-blend-anim img
  35.                               drawable
  36.                               frames
  37.                               max-blur
  38.                               looped)
  39.  
  40.   (define (multi-raise-layer image layer times)
  41.     (while (> times 0)
  42.        (gimp-image-raise-layer image layer)
  43.        (set! times (- times 1))
  44.     )
  45.   )
  46.  
  47.   (let* (
  48.         (max-blur (max max-blur 0))
  49.         (frames (max frames 0))
  50.         (image (car (gimp-image-duplicate img)))
  51.         (width (car (gimp-image-width image)))
  52.         (height (car (gimp-image-height image)))
  53.         (layers (gimp-image-get-layers image))
  54.         (num-layers (car layers))
  55.         (layer-array (cadr layers))
  56.         (slots (- num-layers 2))
  57.         (bg-layer (aref layer-array (- num-layers 1)))
  58.         (max-width 0)
  59.         (max-height 0)
  60.         (offset-x 0)
  61.         (offset-y 0)
  62.         )
  63.  
  64.     (if (> num-layers 2)
  65.         (begin
  66.           (gimp-image-undo-disable image)
  67.  
  68.           (if (= looped TRUE)
  69.               ; add a copy of the lowest blend layer on top
  70.               (let* ((copy (car (gimp-layer-copy
  71.                          (aref layer-array (- num-layers 2)) TRUE))))
  72.                 (gimp-image-add-layer image copy 0)
  73.                 (set! layers (gimp-image-get-layers image))
  74.                 (set! num-layers (car layers))
  75.                 (set! layer-array (cadr layers))
  76.                 (set! slots (- num-layers 2))
  77.                 (set! bg-layer (aref layer-array (- num-layers 1)))))
  78.  
  79.           ; make all layers invisible and check for sizes
  80.           (let* ((min-offset-x width)
  81.                  (min-offset-y height)
  82.                  (layer-count slots))
  83.             (gimp-drawable-set-visible bg-layer FALSE)
  84.             (while (> layer-count -1)
  85.                    (let* ((layer (aref layer-array layer-count))
  86.                   (layer-width (+ (car (gimp-drawable-width layer))
  87.                           (* max-blur 2)))
  88.                   (layer-height (+ (car (gimp-drawable-height layer))
  89.                            (* max-blur 2)))
  90.                   (layer-offsets (gimp-drawable-offsets layer))
  91.                   (layer-offset-x (- (car layer-offsets) max-blur))
  92.                   (layer-offset-y (- (cadr layer-offsets) max-blur)))
  93.                  (gimp-drawable-set-visible layer FALSE)
  94.                  (set! max-width (max max-width layer-width))
  95.                  (set! max-height (max max-height layer-height))
  96.                  (set! min-offset-x (min min-offset-x layer-offset-x))
  97.                  (set! min-offset-y (min min-offset-y layer-offset-y))
  98.                  (set! layer-count (- layer-count 1))))
  99.             (set! offset-x (- (car (gimp-drawable-offsets bg-layer))
  100.                       min-offset-x))
  101.             (set! offset-y (- (cadr (gimp-drawable-offsets bg-layer))
  102.                       min-offset-y)))
  103.  
  104.           ; create intermediate frames by merging copies of adjascent layers
  105.           ; with the background layer
  106.           (let* ((layer-count slots))
  107.             (while (> layer-count 0)
  108.                (let* ((frame-count frames)
  109.                   (lower-layer (aref layer-array layer-count))
  110.                   (upper-layer (aref layer-array (- layer-count 1))))
  111.                  (while (> frame-count 0)
  112.                     (let* ((opacity (* (/ frame-count (+ frames 1)) 100))
  113.                    (blur (/ (* opacity max-blur) 100))
  114.                    (upper-copy (car (gimp-layer-copy upper-layer TRUE)))
  115.                    (lower-copy (car (gimp-layer-copy lower-layer TRUE)))
  116.                    (bg-copy (car (gimp-layer-copy bg-layer TRUE))))
  117.                   (gimp-image-add-layer image bg-copy 0)
  118.                   (gimp-image-add-layer image lower-copy 0)
  119.                   (gimp-image-add-layer image upper-copy 0)
  120.                   (gimp-drawable-set-visible upper-copy TRUE)
  121.                   (gimp-drawable-set-visible lower-copy TRUE)
  122.                   (gimp-drawable-set-visible bg-copy TRUE)
  123.                   (gimp-layer-set-opacity upper-copy (- 100 opacity))
  124.                   (gimp-layer-set-opacity lower-copy opacity)
  125.                   (gimp-layer-set-opacity bg-copy 100)
  126.                   (if (> max-blur 0)
  127.                   (let* ((layer-width (car (gimp-drawable-width upper-copy)))
  128.                          (layer-height (car (gimp-drawable-height upper-copy))))
  129.                     (gimp-layer-set-lock-alpha upper-copy FALSE)
  130.                     (gimp-layer-resize upper-copy
  131.                                (+ layer-width (* blur 2))
  132.                                (+ layer-height (* blur 2))
  133.                                blur
  134.                                blur)
  135.                     (if (>= blur 1.0)
  136.                         (plug-in-gauss-rle RUN-NONINTERACTIVE
  137.                                image
  138.                                upper-copy
  139.                                blur
  140.                                TRUE TRUE))
  141.                     (set! blur (- max-blur blur))
  142.                     (gimp-layer-set-lock-alpha lower-copy FALSE)
  143.                     (set! layer-width (car (gimp-drawable-width
  144.                                 lower-copy)))
  145.                     (set! layer-height (car (gimp-drawable-height
  146.                                  lower-copy)))
  147.                     (gimp-layer-resize lower-copy
  148.                                (+ layer-width (* blur 2))
  149.                                (+ layer-height (* blur 2))
  150.                                blur
  151.                                blur)
  152.                     (if (>= blur 1.0)
  153.                         (plug-in-gauss-rle RUN-NONINTERACTIVE
  154.                                image
  155.                                lower-copy
  156.                                blur
  157.                                TRUE TRUE))))
  158.                   (gimp-layer-resize bg-copy
  159.                              max-width
  160.                              max-height
  161.                              offset-x
  162.                              offset-y)
  163.                   (let* ((merged-layer (car (gimp-image-merge-visible-layers
  164.                                image CLIP-TO-IMAGE))))
  165.                     (gimp-drawable-set-visible merged-layer FALSE))
  166.                   (set! frame-count (- frame-count 1))))
  167.                  (set! layer-count (- layer-count 1)))))
  168.  
  169.           ; merge all original blend layers but the lowest one
  170.               ; with copies of the background layer
  171.           (let* ((layer-count 0))
  172.             (while (< layer-count slots)
  173.                    (let* ((orig-layer (aref layer-array layer-count))
  174.                   (bg-copy (car (gimp-layer-copy bg-layer TRUE))))
  175.                  (gimp-image-add-layer image
  176.                            bg-copy
  177.                            (* layer-count (+ frames 1)))
  178.                  (multi-raise-layer image
  179.                         orig-layer
  180.                         (+ (* (- slots layer-count) frames) 1))
  181.                  (gimp-drawable-set-visible orig-layer TRUE)
  182.                  (gimp-drawable-set-visible bg-copy TRUE)
  183.                  (gimp-layer-resize bg-copy
  184.                         max-width
  185.                         max-height
  186.                         offset-x
  187.                         offset-y)
  188.                  (let* ((merged-layer (car (gimp-image-merge-visible-layers
  189.                           image CLIP-TO-IMAGE))))
  190.                (gimp-drawable-set-visible merged-layer FALSE))
  191.                (set! layer-count (+ layer-count 1)))))
  192.  
  193.           ; merge the lowest blend layer with the background layer
  194.           (let* ((orig-layer (aref layer-array (- num-layers 2))))
  195.             (gimp-drawable-set-visible bg-layer TRUE)
  196.             (gimp-drawable-set-visible orig-layer TRUE)
  197.             (gimp-image-merge-visible-layers image CLIP-TO-IMAGE))
  198.  
  199.           ; make all layers visible again
  200.           (let* ((result-layers (gimp-image-get-layers image))
  201.                  (num-result-layers (car result-layers))
  202.                  (result-layer-array (cadr result-layers))
  203.                  (layer-count (- num-result-layers 1)))
  204.             (while (> layer-count -1)
  205.                (let* ((layer (aref result-layer-array layer-count))
  206.                   (name (string-append "Frame "
  207.                            (number->string
  208.                             (- num-result-layers layer-count) 10))))
  209.                  (gimp-drawable-set-visible layer TRUE)
  210.                  (gimp-drawable-set-name layer name)
  211.                  (set! layer-count (- layer-count 1))))
  212.  
  213.             (if (= looped TRUE)
  214.                 ; remove the topmost layer
  215.                 (gimp-image-remove-layer image (aref result-layer-array 0))))
  216.  
  217.           (gimp-image-undo-enable image)
  218.           (gimp-display-new image)
  219.           (gimp-displays-flush)
  220.         )
  221.  
  222.       (gimp-message _"Blend Animation needs at least three source layers")
  223.     )
  224.   )
  225. )
  226.  
  227. (script-fu-register "script-fu-blend-anim"
  228.     _"_Blend..."
  229.     _"Create intermediate layers to blend two or more layers over a background as an animation"
  230.     "Sven Neumann <sven@gimp.org>"
  231.     "Sven Neumann"
  232.     "1999/12/21"
  233.     "RGB* GRAY*"
  234.     SF-IMAGE       "Image"               0
  235.     SF-DRAWABLE    "Drawable"            0
  236.     SF-ADJUSTMENT _"Intermediate frames" '(3 1 1024 1 10 0 1)
  237.     SF-ADJUSTMENT _"Max. blur radius"    '(0 0 1024 1 10 0 1)
  238.     SF-TOGGLE     _"Looped"              TRUE
  239. )
  240.  
  241. (script-fu-menu-register "script-fu-blend-anim"
  242.                          "<Image>/Filters/Animation/Animators")
  243.